// -*- coding: utf-8 -*- 
/**
 * Project: Java8InActionT
 * Creator: yanking
 * Create time: 2022-02-22 23:52
 * IDE: IntelliJ IDEA
 * Introduction:
 */
package com.ThreadPool.customThreadPool;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class myThreadPool {
    // 构造一个自定义的线程池
    int num; // 当前线程池中线程的数量
    int coreNum; // 线程池的核心线程数量
    int maxNum; // 线程池的最大线程数量
    List<Runnable> task = Collections.synchronizedList(new LinkedList<>());// 任务队列
    int workSize; // 任务队列长度

    // 线程池构造器，用处初始化线程池核心线程数和最大线程数
    public myThreadPool(int coreNum, int maxNum, int workSize) {
        this.coreNum = coreNum;
        this.maxNum = maxNum;
        this.workSize = workSize;
    }

    // 线城池内部方法
    // 1 submit -> 用于提交任务


    /**
     * 提交任务
     */
    public void submit(Runnable r) {
        if (num <= coreNum) {
            // 线程池中线程数量小于核心线程数，直接创建线程
            ++num;
            task.add(r);
            new myWorker("核心线程:" + num, task).start();
        } else if (task.size() <= workSize) {
            // 核心数量饱和，新添加线程加入任务队列中，但是不创建线程解决任务
            System.out.println("任务:" + r + "被缓存...");
            task.add(r);
        } else {
            // 任务队列中的任务数量大于任务队列的长度
            // 执行线程池中的饱和线程机制
            // 任务队列中存在任务，线程池中线程数量超出核心线程数量？
            // 任务队列饱满，但是线程池中的线程数量小于最大线程数量，可以创建非核心线程解决任务
            // 线程存活时间未自定义->任务执行没有输出
            if (num < maxNum) {
                num++;
                new myWorker("非核心线程：" + num, task).start();
            } else {
                System.out.println("任务:" + r + "无法执行，线程池饱和！");
            }
        }
    }


}
